一、赋值操作
赋值操作的操作顺序是从右到左
先计算赋值操作符右边的公式,在赋值给左边变量
二、先运算,再赋值
+=即自加
i+=2;
等同于
i=i+2;
其他的 -= , *= , /= , %= , &= , |= , ^= , >>= , >>>= 都是类似,不做赘述
三、问题研究
1、i的最终结果是?
int i = 1;
i+=++i;
2、结果
3
3、错误答案及原因:
4,因为误会是2+=2了。
4、原因分析
int i = 1; i+=++i; 理解 就是 i = i + ++i
解析:抛开静态情况。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。
首先代码执行过程是:
0: iconst_1 将常量1压入操作数栈。此时栈顶值为1.
1: istore_1 将栈顶元素弹出(值1),存入到局部变量表index为1的位置。这里一般index为0的位置存储的是当前实例。想象下局部变量结构【当前实例,1】
2: iload_1 将局部变量表index的位置值复制一份到操作数栈。栈顶值为1
3: iinc 1, 1 iinc就是进行自增操作 第一个1是操作局部变量表index为1的值,第二个值表示增加的数量 ,也就是++i 等价于i = i+1;1+1=2.把结果存放到局部变量表index为1里面
4: iload_1 将局部变量index为1的值(此刻为2) 存一份到操作数栈。此时操作栈存了 之前的1 和这次的2
5: iadd 这个命令是将操作栈里前俩个值相加 1+2 =3 ,把结果放在栈顶
6: istore_1 将栈顶元素弹出(值3) 存到局部变量index为1的位置 也就是i = 3